package org.balthie.demo.jdk.util.concurrent.auxiliary.cyclicbarrier;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

//BrokenBarrierException表示当前的CyclicBarrier已经损坏了，可能等不到所有线程都到达栅栏了，所以已经在等待的线程也没必要再等了，可以散伙了。
//出现以下几种情况之一时，当前等待线程会抛出BrokenBarrierException异常：
//
//其它某个正在await等待的线程被中断了
//其它某个正在await等待的线程超时了
//某个线程重置了CyclicBarrier(调用了reset方法，后面会讲到)


//https://segmentfault.com/a/1190000015888316
public class CyclicBarrierDemo {

	static class PrepareWork implements Runnable {
		private CyclicBarrier cb;

		PrepareWork(CyclicBarrier cb) {
			this.cb = cb;
		}

		@Override
		public void run() {

			try {
				Thread.sleep(500);
				System.out.println(Thread.currentThread().getName() + ": 准备完成");
				cb.await(); // 在栅栏等待

				System.out.println(Thread.currentThread().getName() + ": 起跑");
				TimeUnit.MILLISECONDS.sleep((long) (Math.random() * 5000));
				System.out.println(Thread.currentThread().getName() + ": 冲过终点");

			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			}
		}
	}
}
